Skip to content

驱虫日志:修复posix_spawnp related execve bad address bug

配置过程按照issue原文进行配置,test只保留spawn 首先我找到了 StarryOS 中 execve系统调用的实现位置:execve.rs

c
TEST(posix_spawnp(&pid, "echo", &fa, 0, (char *[]){"echo","hello",0}, 0), 0);

上面是libctest的代码,其中对于spawn(底层调用为execve)的参数的环境变量为0.

根据 POSIX 标准,execve允许 envp为 NULL(表示使用空环境变量)。但 StarryOS 的实现没有处理这种情况,直接对 NULL 指针调用 vm_load_until_nul,导致返回 EFAULT (BadAddress) 错误。

我查看了 QEMU 中 Linux 的 execve 实现,发现它在处理 envp 之前会检查指针是否为 NULL.

我在arg和env前面添加了检查:

rust
    // Handle NULL argv (treat as empty array)
    let args = if argv.is_null() {
        Vec::new()
    } else {
        vm_load_until_nul(argv)?
            .into_iter()
            .map(vm_load_string)
            .collect::<Result<Vec<_>, _>>()?
    };

    // Handle NULL envp (treat as empty array)
    let envs = if envp.is_null() {
        Vec::new()v
    } else {
        vm_load_until_nul(envp)?
            .into_iter()
            .map(vm_load_string)
            .collect::<Result<Vec<_>, _>>()?
    };

上次更新于: